package model

import (
	"time"

	"github.com/cdongyang/library/utils"
	mgo "gopkg.in/mgo.v2"
	"gopkg.in/mgo.v2/bson"

	"jiance_server/config"
	"jiance_server/mongo"
)

type Grade struct {
	Type  string `bson:"Type,omitempty" json:"type"`
	Score int    `bson:"Score,omitempty" json:"score"`
}

type Fee struct {
	Type   string `bson:"Type,omitempty" json:"type"`
	Status string `bson:"Status,omitempty" json:"status"`
}

type Schedule struct {
	Type   string `bson:"Type,omitempty" json:"type"`
	Status string `bson:"Status,omitempty" json:"status"`
}

type User struct {
	ID       string     `bson:"_id,omitempty" json:"id"`
	Token    string     `bson:"Token,omitempty" json:"token"`
	Password string     `bson:"Password,omitempty" json:",omitempty"`
	Nickname string     `bson:"Nickname,omitempty" json:"nickname"`
	Grade    []Grade    `bson:"Grade,omitempty" json:",omitempty"`
	Fee      []Fee      `bson:"Fee,omitempty" json:",omitempty"`
	Schedule []Schedule `bson:"Schedule,omitempty" json:",omitempty"`
	ClassIDs []string   `bson:"ClassIDs,omitempty" json:",omitempty"`
}

func (u *User) SavePassword() error {
	u.Token = utils.MD5(u.ID, time.Now().Format("2006-01-02 15:04:05")) // 修改密码后重新设置token, 以前的token全部失效, 要重新登录
	return mongo.Users.WithC(func(c *mgo.Collection) error {
		return c.UpdateId(u.ID, bson.M{"$set": bson.M{
			"Token":    utils.MD5(config.GetConfig().Salt, u.Token),
			"Password": u.Password,
		},
		})
	})
}

func (u *User) SetToken() error {
	u.Token = utils.MD5(u.ID, time.Now().Format("2006-01-02 15:04:05"))
	return mongo.Users.WithC(func(c *mgo.Collection) error {
		return c.UpdateId(u.ID, bson.M{"$set": bson.M{"Token": utils.MD5(config.GetConfig().Salt, u.Token)}})
	})
}

func FindUserByToken(token string, hasSalt bool, selector interface{}) (user *User, err error) {
	user = &User{}
	if !hasSalt {
		token = utils.MD5(config.GetConfig().Salt, token)
	}
	return user, mongo.Users.WithC(func(c *mgo.Collection) error {
		return c.Find(bson.M{"Token": token}).Select(selector).One(user)
	})
}

func DeleteToken(token string, hasSalt bool) (err error) {
	if !hasSalt {
		token = utils.MD5(config.GetConfig().Salt, token)
	}
	return mongo.Users.WithC(func(c *mgo.Collection) error {
		return c.Update(bson.M{"Token": token}, bson.M{"$set": bson.M{"Token": ""}})
	})
}

func FindUserByID(id string, selector interface{}) (user *User, err error) {
	user = &User{}
	return user, mongo.Users.WithC(func(c *mgo.Collection) error {
		return c.FindId(id).Select(selector).One(user)
	})
}
